package com.webserver.core;

import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;

import java.io.*;
import java.net.Socket;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;

/**
 * 当前线程任务负责与指定的客户端进行交互
 * 1解析请求
 * 2处理请求
 * 3发送响应第四步
 * 当一个客户端连接进入这个线程上就相当与接通一个电话然后进行上面三部操作
 */
public class ClientHandler implements Runnable {
    //定义一个套接字(电话)属性第五步
    private Socket socket;
    //构造方法里面赋值 第六步
    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        try {
           //1解析请求第二十三步
            HttpServletRequest request = new HttpServletRequest(socket);
            //创建一个响应对象第四十五步
            HttpServletResponse response = new HttpServletResponse(socket);
            String path = request.getUri();
            System.out.println("抽象路径"+path);
            //2处理请求
            //第三十步定位类加载路径
            File root = new File(ClientHandler.class.getClassLoader().getResource(".").toURI());
            //static路径根据类加载路径找到的
            File staticDir = new File(root,"static");
            //根据static找到index (改成根据抽象路径（path）找到地址)
            File file = new File(staticDir,path);
            //定义一个变量用来接收是否是个文件返回的输出语句
          //  String statusLine;
            //第三十九步判断是否是个文件 如果是文件就读取否则返回404
            if (file.isFile()){
                //存在
//                statusLine = "HTTP/1.1 200 OK";
                //第五十一步将发送的状态行改造成方法
                response.setContentFile(file);
            }else {
                //不存在
                //五十二步如果不存在改成404
                response.setStatusCode(404);
                response.setStatusReason("NotFound");
                //回给它一个404页面
                file = new File(staticDir,"404.html");
                response.setContentFile(file);
                //statusLine = "HTTP/1.1 404 NotFound";


            }





            //3发送响应
            //第五十步调方法发送响应
            response.response();

            //3发送响应正文第三十四步
            OutputStream out = socket.getOutputStream();
            FileInputStream fis = new FileInputStream(file);
            byte[] buf =new byte[1024*10];
            int len;
            while ((len=fis.read(buf))!=-1) {
                out.write(buf,0,len);
            }


        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }finally {

            try {
                //交互完毕断开连接
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
    //第三十五步将消息转成数组发送 做成一个方法



}
